/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BeansGerenciaveis;

import DAO.AutorDao;
import DAO.AvaliacaoDAO;
import DAO.CursoDAO;
import DAO.ImagemDao;
import DAO.InstituicaoDao;
import DAO.PDFDao;
import DAO.PPPDao;
import bean.Autor;
import bean.AvaliacaoMEC;
import bean.Coordenacao;
import bean.Curso;
import bean.EgressosCurso;
import bean.Imagem;
import bean.Instituicao;
import bean.PDF;
import bean.PPP;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.event.FlowEvent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;

/**
 *
 * @author fernando
 */
@ManagedBean
@ViewScoped
public class CursoBean implements Serializable {

    /**
     * d
     * Creates a new instance of CursoBean
     */
    public CursoBean() {
        this.curso = new Curso();
        this.pppSelecionado = new PPP();
        this.listaPPP = new ArrayList<PPP>();
        this.pppSelecionadoRemocao = new PPP();
        this.coordenacaoSelecionada = new Coordenacao();
        this.coordenacaoSelecionadaRemocao = new Coordenacao();
        this.listaCoordenacoes = new ArrayList<Coordenacao>();
        this.avaliacaoSelecionada = new AvaliacaoMEC();
        this.avaliacaoSelecionadaRemocao = new AvaliacaoMEC();
        this.listaAvaliacoes = new ArrayList<AvaliacaoMEC>();
        this.tiposDeCurso = new ArrayList(Arrays.asList("Graduação Bacharelado", "Graduação Licenciatura", "Graduação Tecnológica", "Especialização/MBA/MSA", "Mestrado Profissional", "Mestrado Acadêmico", "Doutorado Profissional", "Dourado Acadêmico"));
        this.listaEgressos = new ArrayList<EgressosCurso>();
        this.listaDocentesSelecionados = new ArrayList<Autor>();
        this.professorSelecionadoRemocao = new Autor();
        this.cd = new CursoDAO();
        this.egressosCursoSelecionadoRemocao = new EgressosCurso();
        this.egressosCursoSelecionado = new EgressosCurso();
        this.professorSelecionado = new Autor();
        this.tipoTrabalhoFinal = new ArrayList();
    }

    @PostConstruct
    public void init() {
        atribuirEstadoInicial();
    }

    private void atribuirEstadoInicial() {
        this.curso = new Curso();
        this.pppSelecionado = new PPP();
        this.listaPPP = new ArrayList<PPP>();
        this.pppSelecionadoRemocao = new PPP();
        this.coordenacaoSelecionada = new Coordenacao();
        this.coordenacaoSelecionadaRemocao = new Coordenacao();
        this.listaCoordenacoes = new ArrayList<Coordenacao>();
        this.avaliacaoSelecionada = new AvaliacaoMEC();
        this.avaliacaoSelecionadaRemocao = new AvaliacaoMEC();
        this.listaAvaliacoes = new ArrayList<AvaliacaoMEC>();
        this.tiposDeCurso = new ArrayList(Arrays.asList("Graduação Bacharelado", "Graduação Licenciatura", "Graduação Tecnológica", "Especialização/MBA/MSA", "Mestrado Profissional", "Mestrado Acadêmico", "Doutorado Profissional", "Dourado Acadêmico"));
        this.periodicidadeOferta = new ArrayList(Arrays.asList("Anual", "Semestral", "Por demanda", "Não Informado"));
        this.listaDocentesSelecionados = new ArrayList<Autor>();
        this.professorSelecionadoRemocao = new Autor();
        this.cursos = null;
        this.cd = new CursoDAO();
        this.egressosCursoSelecionado = new EgressosCurso();
        this.professorFiltro = new ArrayList<Autor>();
        this.professorSelecionado = new Autor();
    }

    public String cadastrarCurso() {
        String resultado = "";
        this.curso.setEngressosCursos(listaEgressos);
        this.curso.setAvaliacoesMEC(listaAvaliacoes);
        this.curso.setCoordenacoes(listaCoordenacoes);
        this.curso.setProfessores(listaDocentesSelecionados);
        this.curso.setpPPs(listaPPP);

        if (cd.cadastrarCurso(curso)) {
            resultado = "listar.xhtml?faces-redirect=true";
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage("Sucesso", "Curso Cadastrado com Sucesso!"));
        }
        this.cursos = null;
        this.novoCurso();
        return resultado;

    }

    public void selecionarCoordenacoes() {
        this.listaCoordenacoes = (ArrayList<Coordenacao>) curso.getCoordenacoes();
    }

    public void selecionarPPPs() {
        this.listaPPP = (ArrayList) new PPPDao().buscarPPPsCurso(curso.getId());
    }

    public void selecionarDocentes() {
        this.listaDocentesSelecionados = (ArrayList) curso.getProfessores();
    }

    public void selecionarAvaliacoes() {
        
        this.listaAvaliacoes = (ArrayList<AvaliacaoMEC> )new AvaliacaoDAO().buscarAvaliacoesCurso(this.curso.getId());
        System.out.println("selecionarAvaliacoes Fui executado, Quantidade Avaliações:" + listaAvaliacoes.size());
    }
    
    public String selecionarCursoDeletar() {
        String resultado = "";
        System.out.println("Curso Selecionado: " + cursoSelecionado.getNome());
        this.curso = new CursoDAO().buscarCurso(cursoSelecionado.getId());
        

        this.cursoSelecionado = new Curso();
        resultado = "alterar?faces-redirect=true&amp;includeViewParams=true";
        return resultado;
    }

    
    public String selecionarCursoEdicao() {
        String resultado = "";
        System.out.println("Curso Selecionado: " + cursoSelecionado.getNome());
        this.curso = new CursoDAO().buscarCurso(cursoSelecionado.getId());
        /*
        this.listaEgressos = (ArrayList) curso.getEngressosCursos();
        this.listaAvaliacoes = (ArrayList) curso.getAvaliacoesMEC();
        this.listaCoordenacoes = (ArrayList) curso.getCoordenacoes();
        this.listaDocentesSelecionados = (ArrayList) curso.getProfessores();
        this.listaPPP = (ArrayList) curso.getPpps();*/

        this.cursoSelecionado = new Curso();
        resultado = "alterar?faces-redirect=true&amp;includeViewParams=true";
        return resultado;
    }

    public void novoCurso() {
        this.curso = new Curso();
        this.pppSelecionado = new PPP();
        this.listaPPP = new ArrayList<PPP>();
        this.pppSelecionadoRemocao = new PPP();
        this.coordenacaoSelecionada = new Coordenacao();
        this.coordenacaoSelecionadaRemocao = new Coordenacao();
        this.listaCoordenacoes = new ArrayList<Coordenacao>();
        this.avaliacaoSelecionada = new AvaliacaoMEC();
        this.avaliacaoSelecionadaRemocao = new AvaliacaoMEC();
        this.listaAvaliacoes = new ArrayList<AvaliacaoMEC>();
        this.tiposDeCurso = new ArrayList(Arrays.asList("Graduação Tecnológica", "Graduação Licenciatura", "Graduação Bacharelado", "Especialização/MBA/MSA", "Mestrado Profissional", "Mestrado Acadêmico", "Doutorado Acadêmico", "Doutorado Profissional"));
        this.listaDocentesSelecionados = new ArrayList<Autor>();
        this.professorSelecionadoRemocao = new Autor();

    }

    public void alteraDocentes() {

        if (cd.alterarDocentes(curso)) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage("Alteração realizada com sucesso", ""));
            this.curso = cd.buscarCurso(curso.getId());
        }else{
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível alterar os Docentes", ""));
            
        }


    }

    public void alteraInformacoesBasicas() {
        
        if (cd.alterarInformacoesBasicas(curso)) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage("Alteração realizada com sucesso", ""));
            this.curso = cd.buscarCurso(curso.getId());
        }else{
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível alterar as Informações básicas", ""));
            
        }
    }

    public void alterarCoordenacoes() {
        if (cd.alterarCoordenacoes(curso)) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage("Alteração realizada com sucesso", ""));
            this.curso = cd.buscarCurso(curso.getId());
        }else{
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível alterar as Coordenações", ""));
            
        }
    }

    public void alterarNotas() {
        if (cd.alterarNotas(curso)) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage("Alteração realizada com sucesso", ""));
            this.curso = cd.buscarCurso(curso.getId());
        }else{
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível alterar as Avaliações", ""));
            
        }
    }

    public void alterarPPPs() {
        if (cd.alterarPPPs(curso)) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage("Alteração realizada com sucesso", ""));
            this.curso = cd.buscarCurso(curso.getId());
        }else{
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível alterar os PPPs", ""));
            
        }
    }

    public void alterarPPP() {
        if (cd.alterarPPP(pppSelecionado)) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage("Alteração realizada com sucesso", ""));
            this.curso = cd.buscarCurso(curso.getId());
            this.pppSelecionado = new PPP();
        }
        else{
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível alterar o PPP", ""));
            
        }
    }

    public void alterarEmentaPPP() {
        if (cd.alterarMatrizPPP(pppSelecionado)) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage("Alteração realizada com sucesso", ""));
            this.curso = cd.buscarCurso(curso.getId());
            this.pppSelecionado = new PPP();
        }

    }
    
    
    public void alterarPdfPPP() {
        if (cd.alterarPDFPPP(pppSelecionado)) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage("Alteração realizada com sucesso", ""));
            this.curso = cd.buscarCurso(curso.getId());
            this.pppSelecionado = new PPP();
        }else{
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível alterar PDF", ""));
            
        }

    }

    public void buscarDadosCurso() {
        this.curso = new CursoDAO().buscarCurso(curso.getId());
    }

    public Curso getCurso() {
        return curso;
    }

    public void setCurso(Curso curso) {
        this.curso = curso;
    }

    public ArrayList<Curso> getCursos() {
        if (this.cursos == null) {
            cursos = (ArrayList<Curso>) new CursoDAO().listarCursos();
        }

        return cursos;
    }

    public void setCursos(ArrayList<Curso> cursos) {
        this.cursos = cursos;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        CursoBean.logger = logger;
    }

    public PPP getPppSelecionado() {
        return pppSelecionado;
    }

    public void setPppSelecionado(PPP pppSelecionado) {
        System.out.println("Passei aqui: setPPPSelecionado");
        this.pppSelecionado = pppSelecionado;
    }

    public void doUpload(FileUploadEvent fileUploadEvent) throws IOException {
        UploadedFile uploadedFile = fileUploadEvent.getFile();
        
        if (!uploadedFile.getFileName().isEmpty()) {
         
            if (new ImagemDao().validarCadastroImagem(uploadedFile.getFileName())) {
                Imagem matrizCurricular = new Imagem();
                matrizCurricular.setConteudo(PDF.readFully(uploadedFile.getInputstream(), (int) uploadedFile.getSize(), true));
                matrizCurricular.setFormato(uploadedFile.getContentType());
                System.out.println("Formato:" + matrizCurricular.getFormato());
                matrizCurricular.setNome(uploadedFile.getFileName());
                System.out.println("Nome Arquivo:" + matrizCurricular.getNome());
                this.pppSelecionado.setMatrizCurricular(matrizCurricular);

                FacesContext facesContext = FacesContext.getCurrentInstance();
                facesContext.addMessage(null, new FacesMessage("Aquivo Recebido com Sucesso", ""));
            } else {
                FacesContext facesContext = FacesContext.getCurrentInstance();
                facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possivel fazer upload:", "Já existe uma imagem cadastrada com esse nome! "));
            }

        } else {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi selecionado um arquivo para upload", ""));

        }

    }

    public void doUploadPDF(FileUploadEvent event) {
        try {
            System.out.println("UploadRelatorio Avalização");
            UploadedFile file = event.getFile();
            if (!file.getFileName().isEmpty()) {
                if (new PDFDao().validarInsercaoPdf(file.getFileName())) {
                    System.out.println("Dados: " + file.getFileName() + file.getContentType());
                    pdfUpload = new PDF();
                    pdfUpload.setConteudo(file.getContents());
                    pdfUpload.setNome(file.getFileName());
                    avaliacaoSelecionada.setPdf(pdfUpload);
                    FacesContext facesContext = FacesContext.getCurrentInstance();
                    facesContext.addMessage(null, new FacesMessage("Aquivo Recebido com Sucesso", ""));
                } else {
                    FacesContext facesContext = FacesContext.getCurrentInstance();
                    facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro:", "Já existe uma pdf cadastrado com esse nome! "));
                }

            }

        } catch (Exception ex) {
            Logger.getLogger(CursoBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void doUploadPPP(FileUploadEvent event) {
        try {

            UploadedFile file = event.getFile();
            if (!file.getFileName().isEmpty()) {
                if (new PDFDao().validarInsercaoPdf(file.getFileName())) {
                    System.out.println("Dados: " + file.getFileName() + file.getContentType());
                    pdfUpload = new PDF();
                    pdfUpload.setConteudo(readFully(file.getInputstream(), (int) file.getSize(), true));
                    pdfUpload.setNome(file.getFileName());
                    pppSelecionado.setPdf(pdfUpload);
                    FacesContext facesContext = FacesContext.getCurrentInstance();
                    facesContext.addMessage(null, new FacesMessage("Aquivo Recebido com Sucesso", ""));
                } else {
                    FacesContext facesContext = FacesContext.getCurrentInstance();
                    facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possivel fazer upload:", "Já existe uma pdf cadastrado com esse nome! "));
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(CursoBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public static byte[] readFully(InputStream is, int length, boolean readAll)
            throws IOException {
        byte[] output = {};
        if (length == -1) {
            length = Integer.MAX_VALUE;
        }
        int pos = 0;
        while (pos < length) {
            int bytesToRead;
            if (pos >= output.length) { // Only expand when there's no room
                bytesToRead = Math.min(length - pos, output.length + 1024);
                if (output.length < pos + bytesToRead) {
                    output = Arrays.copyOf(output, pos + bytesToRead);
                }
            } else {
                bytesToRead = output.length - pos;
            }
            int cc = is.read(output, pos, bytesToRead);
            if (cc < 0) {
                if (readAll && length != Integer.MAX_VALUE) {
                    throw new EOFException("Detect premature EOF");
                } else {
                    if (output.length != pos) {
                        output = Arrays.copyOf(output, pos);
                    }
                    break;
                }
            }
            pos += cc;
        }
        return output;
    }

    public ArrayList<PPP> getListaPPP() {
        return listaPPP;
    }

    public void setListaPPP(ArrayList<PPP> listaPPP) {
        this.listaPPP = listaPPP;
    }

    public PPP getPppSelecionadoRemocao() {
        return pppSelecionadoRemocao;
    }

    public void setPppSelecionadoRemocao(PPP pppSelecionadoRemocao) {
        this.pppSelecionadoRemocao = pppSelecionadoRemocao;
    }

    public CursoDAO getCd() {
        return cd;
    }

    public void setCd(CursoDAO cd) {
        this.cd = cd;
    }

    public Coordenacao getCoordenacaoSelecionada() {
        return coordenacaoSelecionada;
    }

    public void setCoordenacaoSelecionada(Coordenacao coordenacaoSelecionada) {
        this.coordenacaoSelecionada = coordenacaoSelecionada;
    }

    public Coordenacao getCoordenacaoSelecionadaRemocao() {
        return coordenacaoSelecionadaRemocao;
    }

    public void setCoordenacaoSelecionadaRemocao(Coordenacao coordenacaoSelecionadaRemocao) {
        this.coordenacaoSelecionadaRemocao = coordenacaoSelecionadaRemocao;
    }

    public AvaliacaoMEC getAvaliacaoSelecionada() {
        return avaliacaoSelecionada;
    }

    public void setAvaliacaoSelecionada(AvaliacaoMEC avaliacaoSelecionada) {
        this.avaliacaoSelecionada = avaliacaoSelecionada;
    }

    public AvaliacaoMEC getAvaliacaoSelecionadaRemocao() {
        return avaliacaoSelecionadaRemocao;
    }

    public void setAvaliacaoSelecionadaRemocao(AvaliacaoMEC avaliacaoSelecionadaRemocao) {
        this.avaliacaoSelecionadaRemocao = avaliacaoSelecionadaRemocao;
    }

    public ArrayList<AvaliacaoMEC> getListaAvaliacoes() {
        return listaAvaliacoes;
    }

    public void setListaAvaliacoes(ArrayList<AvaliacaoMEC> listaAvaliacoes) {
        this.listaAvaliacoes = listaAvaliacoes;
    }

    public ArrayList<String> getTiposDeCurso() {
        return tiposDeCurso;
    }

    public void setTiposDeCurso(ArrayList<String> tiposDeCurso) {
        this.tiposDeCurso = tiposDeCurso;
    }

    public ArrayList<Coordenacao> getListaCoordenacoes() {
        return listaCoordenacoes;
    }

    public void setListaCoordenacoes(ArrayList<Coordenacao> listaCoordenacoes) {
        this.listaCoordenacoes = listaCoordenacoes;
    }

    public Autor[] getDocentesSelecionados() {
        return docentesSelecionados;
    }

    public void setDocentesSelecionados(Autor[] docentesSelecionados) {
        this.docentesSelecionados = docentesSelecionados;
    }

    public ProfessoresDataModel getListaDocentes() {
        if (listaDocentes == null) {
            this.listaDocentes = new ProfessoresDataModel(new AutorDao().listarAutores());
        }
        return listaDocentes;
    }

    public Curso getCursoSelecionado() {
        return cursoSelecionado;
    }

    public void setCursoSelecionado(Curso cursoSelecionado) {
        this.cursoSelecionado = new CursoDAO().buscarCurso(cursoSelecionado.getId());
        
    }

    public void setListaDocentes(ProfessoresDataModel listaDocentes) {
        this.listaDocentes = listaDocentes;
    }

    public void addPPP2() {
        System.out.println("Id elaborador:" + professorSelecionadoRemocao.getId());
        this.listaPPP.add(pppSelecionado);
        this.pppSelecionado = new PPP();
        this.professorSelecionadoRemocao = new Autor();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        facesContext.addMessage(null, new FacesMessage("Sucesso", "PPP adicionado!"));
    }

    public void addPPP() {
        System.out.println("Passei aqui! addPPP!");
        this.listaPPP.add(pppSelecionado);
        this.pppSelecionado = new PPP();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        facesContext.addMessage(null, new FacesMessage("Sucesso", "PPP adicionado!"));
    }

    public void addPPPBanco() {
        System.out.println("Entrei no AddPPPBanco");
        if (new PPPDao().cadastrarPPP(pppSelecionado, curso.getId())) {
            this.listaPPP.add(pppSelecionado);
            this.pppSelecionado = new PPP();
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage("Sucesso", "PPP adicionado ao Banco de Dados!"));
        }else{
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro", "Desculpe, ocorreu um erro e o PPP não foi cadastrado"));
        }
        
    }

    public void removerPPP() {
        this.listaPPP.remove(pppSelecionadoRemocao);
        this.pppSelecionadoRemocao = new PPP();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        facesContext.addMessage(null, new FacesMessage("Sucesso", "PPP removido!"));

    }

    public void removerPPPDoBanco() {
        if (new PPPDao().removerPPP(pppSelecionadoRemocao)) {
            this.listaPPP.remove(pppSelecionadoRemocao);
            new PPPDao().removerPPP(pppSelecionadoRemocao);
            this.pppSelecionadoRemocao = new PPP();
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage("Sucesso", "PPP removido do Banco de Dados!"));
        } else {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro", "Desculpe, ocorreu um erro inesperado e o PPP não foi removido!"));
        }

    }

    public void addCoordenacao() {
        coordenacaoSelecionada.setCoordenador(new AutorDao().consultaAutor(coordenacaoSelecionada.getCoordenador().getId()));
        this.listaCoordenacoes.add(coordenacaoSelecionada);
        this.coordenacaoSelecionada = new Coordenacao();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        facesContext.addMessage(null, new FacesMessage("Sucesso", "Cordenação adicionada!"));
    }

    public void removerCoordenacao() {
        this.listaCoordenacoes.remove(coordenacaoSelecionadaRemocao);
        coordenacaoSelecionadaRemocao = new Coordenacao();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        facesContext.addMessage(null, new FacesMessage("Sucesso", "Coordenação removida!"));
    }

    public void addAvaliacao() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        if (this.listaAvaliacoes.contains(this.avaliacaoSelecionada)) {
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "Já foi cadastrada uma avaliação com esses dados."));

            return;

        } else if (this.avaliacaoSelecionada.getAnoInicio() <= this.avaliacaoSelecionada.getAnoFim()) {
            this.listaAvaliacoes.add(avaliacaoSelecionada);
            avaliacaoSelecionada = new AvaliacaoMEC();
        } else {

            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "O ano do início da avalição não pode ser maior que o do término!."));

        }


    }

    public void addAvaliacaoBanco() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        if (!this.avaliacaoSelecionada.getPdf().getNome().isEmpty()) {
            if (!new PDFDao().validarInsercaoPdf(avaliacaoSelecionada.getPdf().getNome())) {
                facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "Já existe um arquivo PDF cadastrado com esse nome em nossa base de dados! "));
                return;
            }
        }
        if (this.listaAvaliacoes.contains(this.avaliacaoSelecionada)) {
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "Já foi cadastrada uma avaliação com esses dados."));

            return;

        } else if (this.avaliacaoSelecionada.getAnoInicio() <= this.avaliacaoSelecionada.getAnoFim()) {
            if (new AvaliacaoDAO().cadastrarAvaliacao(avaliacaoSelecionada, this.curso.getId())) {
                this.listaAvaliacoes.add(avaliacaoSelecionada);
                avaliacaoSelecionada = new AvaliacaoMEC();
                facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso:", "Avaliação cadastrada com Sucesso! Alterações salvadas automaticamente."));
            } else {
                facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "Ocorreu um erro durante a gravação dos dados! ."));
            }

        } else {

            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "O ano do início da avalição não pode ser maior que o do término!."));

        }


    }

    public void removerAvaliacao() {

        this.listaAvaliacoes.remove(avaliacaoSelecionadaRemocao);
        avaliacaoSelecionadaRemocao = new AvaliacaoMEC();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso:", "Avaliação removida do banco de dados com Sucesso! Alterações salvadas automaticamente."));

    }

    public void removerAvaliacaoBanco() {
        new AvaliacaoDAO().removerAvaliacao(avaliacaoSelecionadaRemocao, curso.getId());
        this.listaAvaliacoes.remove(avaliacaoSelecionadaRemocao);
        avaliacaoSelecionadaRemocao = new AvaliacaoMEC();
    }

    public ArrayList<Autor> getListaDocentesSelecionados() {
        return listaDocentesSelecionados;
    }

    public void setListaDocentesSelecionados(ArrayList<Autor> listaDocentesSelecionados) {
        this.listaDocentesSelecionados = listaDocentesSelecionados;
    }

    public ArrayList<Integer> getListaNotasDisponiveis() {
        ArrayList<Integer> notas = new ArrayList<Integer>();
        if (this.curso.getTipologia().isEmpty()) {
            return notas;
        } else if ((this.curso.getTipologia().equalsIgnoreCase("Mestrado Acadêmico")) || (this.curso.getTipologia().equalsIgnoreCase("Doutorado Acadêmico"))) {
            notas = new ArrayList(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
            return notas;
        } else {
            notas = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));
            return notas;
        }


    }

    public void atualizarListaNotas() {
        this.getListaNotasDisponiveis();
    }

    public void atualizarPeriodicidade() {
        this.getUnidadeTempo();
    }

    public void addProfessores() {

        this.listaDocentesSelecionados.addAll(Arrays.asList(docentesSelecionados));
        this.docentesSelecionados = null;
    }

    public Autor getProfessorSelecionadoRemocao() {
        return professorSelecionadoRemocao;
    }

    public void setProfessorSelecionadoRemocao(Autor professorSelecionadoRemocao) {
        this.professorSelecionadoRemocao = professorSelecionadoRemocao;
    }

    public void addProfessor() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        if (this.listaDocentesSelecionados.contains(professorSelecionado)) {
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "O docente já cadastrado"));
        } else {
            this.listaDocentesSelecionados.add(professorSelecionado);
            professorSelecionado = new Autor();
        }

    }

    public void removerProfessor() {
        this.listaDocentesSelecionados.remove(professorSelecionadoRemocao);
        professorSelecionadoRemocao = new Autor();
    }

    public String onFlowProcess(FlowEvent event) {
        logger.info("Current wizard step:" + event.getOldStep());
        logger.info("Next step:" + event.getNewStep());
        if (event.getOldStep().equals("tabInformacoesBasicas") && !this.validarAba1()) {
            return event.getOldStep();
        } else if (event.getOldStep().equals("tabCoordenacaoes")) {
            this.validarAba6();
        }
        return event.getNewStep();
    }

    public boolean validarAba1() {
        if (this.curso.getNome().isEmpty()) {
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "É obrigatório o cadastro de um nome para o curso."));
            logger.info("É obrigatório o cadastro de um nome para o curso");
            return false;
        } else if (this.curso.getInstituicao().getId() == 0) {
            logger.info("É obrigatório selecionar um instituição para o curso");
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "É obrigatório selecionar um instituição para o curso."));
            return false;
        } else if (this.curso.getTipologia().isEmpty()) {
            logger.info("É obrigatório selecionar uma tipologia para o curso");
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "É obrigatório selecionar uma tipologia para o curso."));
            return false;
        }
        
        else if(!new CursoDAO().validarCadastroCurso(curso)){
            logger.info("Já existe um curso cadastrado com esse nome, instituição e tipologia!");
            FacesContext facesContext = FacesContext.getCurrentInstance();
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "Já existe um curso cadastrado com esse nome, instituição e tipologia!"));
            return false;
            
        }
        
        return true;
    }

    public boolean validarAba6() {
        Instituicao i = new InstituicaoDao().consultaInstituicao(this.curso.getInstituicao().getId());
        i.setId(this.curso.getInstituicao().getId());
        this.curso.setInstituicao(i);
        return true;
    }
    /*
     public void buscarImagemMatriz() {
     ImagemDao imDao = new ImagemDao();
     this.pppSelecionado.setMatrizCurricular(imDao.consultarImagem(this.pppSelecionado.getId()));
     }*/

    public StreamedContent getImagem() {
        return imagem;
    }

    public void setImagem(StreamedContent imagem) {
        this.imagem = imagem;
    }

    public EgressosCurso getEgressosCursoSelecionado() {
        return egressosCursoSelecionado;
    }

    public void setEgressosCursoSelecionado(EgressosCurso egressosCursoSelecionado) {
        this.egressosCursoSelecionado = egressosCursoSelecionado;
    }

    public ArrayList<String> getPeriodicidadeOferta() {
        return periodicidadeOferta;
    }

    public void setPeriodicidadeOferta(ArrayList<String> periodicidadeOferta) {
        this.periodicidadeOferta = periodicidadeOferta;
    }

    public String getUnidadeTempo() {
        unidadeTempo = "";
        if (this.curso.getPeriodicidadeOferta() != null) {
            if (this.curso.getPeriodicidadeOferta().equals("Semestral")) {
                this.unidadeTempo = "em Semestres";
            } else {
                this.unidadeTempo = "em Anos";
            }
        }



        return unidadeTempo;
    }

    public void setUnidadeTempo(String unidadeTempo) {

        this.unidadeTempo = unidadeTempo;
    }

    public ArrayList<EgressosCurso> getListaEgressos() {
        return listaEgressos;
    }

    public void setListaEgressos(ArrayList<EgressosCurso> listaEgressos) {
        this.listaEgressos = listaEgressos;
    }

    public void addMapeamentoEvasao() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        if (this.listaEgressos.contains(this.egressosCursoSelecionado)) {
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "Já foi cadastrada o mapeamento da evasão para esse período"));


        } else if (!this.egressosCursoSelecionado.getPeriodo().isEmpty()) {
            this.listaEgressos.add(egressosCursoSelecionado);
            egressosCursoSelecionado = new EgressosCurso();
        } else {
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "É necessário preencher o período"));
        }


    }
    
    public void addMapeamentoEvasaoEdicao() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        if (this.curso.getEngressosCursos().contains(this.egressosCursoSelecionado)) {
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "Já foi cadastrada o mapeamento da evasão para esse período"));


        } else if (!this.egressosCursoSelecionado.getPeriodo().isEmpty()) {
            this.curso.getEngressosCursos().add(egressosCursoSelecionado);
            egressosCursoSelecionado = new EgressosCurso();
        } else {
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Atenção:", "É necessário preencher o período"));
        }


    }

    public void removerMapeamentoEvasao() {
        this.listaEgressos.remove(egressosCursoSelecionadoRemocao);
        egressosCursoSelecionadoRemocao = new EgressosCurso();

    }
    public void removerMapeamentoEvasaoEdicao() {
        this.curso.getEngressosCursos().remove(egressosCursoSelecionadoRemocao);
        egressosCursoSelecionadoRemocao = new EgressosCurso();

    }

    public EgressosCurso getEgressosCursoSelecionadoRemocao() {
        return egressosCursoSelecionadoRemocao;
    }

    public void setEgressosCursoSelecionadoRemocao(EgressosCurso egressosCursoSelecionadoRemocao) {
        this.egressosCursoSelecionadoRemocao = egressosCursoSelecionadoRemocao;
    }

    public ArrayList<Autor> getProfessorFiltro() {
        return professorFiltro;
    }

    public void setProfessorFiltro(ArrayList<Autor> professorFiltro) {
        this.professorFiltro = professorFiltro;
    }

    public Autor getProfessorSelecionado() {
        return professorSelecionado;
    }

    public void setProfessorSelecionado(Autor professorSelecionado) {
        this.professorSelecionado = professorSelecionado;
    }

    public ArrayList<String> getTipoTrabalhoFinal() {

        if (this.curso.getTipologia().isEmpty()) {
            return tipoTrabalhoFinal;
        } else if ((this.curso.getTipologia().equalsIgnoreCase("Graduação Bacharelado")) || (this.curso.getTipologia().equalsIgnoreCase("Graduação Licenciatura")) || (this.curso.getTipologia().equalsIgnoreCase("Graduação Tecnológica"))) {
            tipoTrabalhoFinal = new ArrayList(Arrays.asList("TCC", "Monografia"));
            return tipoTrabalhoFinal;
        } else if ((this.curso.getTipologia().equalsIgnoreCase("Mestrado Acadêmico")) || (this.curso.getTipologia().equalsIgnoreCase("Mestrado Profissional"))) {
            tipoTrabalhoFinal = new ArrayList(Arrays.asList("Dissertação", "Dissertação-projeto", "Projeto", "Artigo publicado", "Artigo para publicação"));
            return tipoTrabalhoFinal;
        } else if ((this.curso.getTipologia().equalsIgnoreCase("Especialização/MBA/MSA"))) {
            tipoTrabalhoFinal = new ArrayList(Arrays.asList("TCC", "Monografia", "Projeto", "Artigo publicado", "Artigo para publicação"));
            return tipoTrabalhoFinal;
        } else if ((this.curso.getTipologia().equalsIgnoreCase("Doutorado Profissional")) || (this.curso.getTipologia().equalsIgnoreCase("Dourado Acadêmico"))) {
            tipoTrabalhoFinal = new ArrayList(Arrays.asList("Tese"));
            return tipoTrabalhoFinal;
        }


        return tipoTrabalhoFinal;
    }

    public void setTipoTrabalhoFinal(ArrayList<String> tipoTrabalhoFinal) {
        this.tipoTrabalhoFinal = tipoTrabalhoFinal;
    }

    public PDF getPdfUpload() {
        return pdfUpload;
    }

    public void setPdfUpload(PDF pdfUpload) {
        this.pdfUpload = pdfUpload;
    }
    private ArrayList<String> tipoTrabalhoFinal;
    private String unidadeTempo;
    private Curso curso;
    private ArrayList<Curso> cursos;
    private PPP pppSelecionado;
    private PPP pppSelecionadoRemocao;
    private ArrayList<PPP> listaPPP;
    private Coordenacao coordenacaoSelecionada;
    private Coordenacao coordenacaoSelecionadaRemocao;
    private ArrayList<Coordenacao> listaCoordenacoes;
    private AvaliacaoMEC avaliacaoSelecionada;
    private AvaliacaoMEC avaliacaoSelecionadaRemocao;
    private ArrayList<AvaliacaoMEC> listaAvaliacoes;
    private ArrayList<String> tiposDeCurso;
    private ArrayList<String> periodicidadeOferta;
    private Autor[] docentesSelecionados;
    private ProfessoresDataModel listaDocentes;
    private ArrayList<Autor> listaDocentesSelecionados;
    private ArrayList<Autor> professorFiltro;
    private Autor professorSelecionadoRemocao;
    private Autor professorSelecionado;
    private Curso cursoSelecionado;
    private CursoDAO cd = new CursoDAO();
    private static Logger logger = Logger.getLogger(CursoBean.class
            .getName());
    private StreamedContent imagem;
    private EgressosCurso egressosCursoSelecionado;
    private EgressosCurso egressosCursoSelecionadoRemocao;
    private ArrayList<EgressosCurso> listaEgressos;
    private PDF pdfUpload = new PDF();
}
